/**
 * 消息类型常量定义 - 与后端保持一致
 * 
 * 编码规则：
 * -128 到 -1: 系统消息 (System Messages) - 由系统自动生成，用户只需查看
 * 0 到 63: 用户事务 (User Affairs) - 由用户主动发送，需要接收方处理
 * 64 到 95: 投票事务 (Vote Affairs) - 投票相关消息，需要用户投票
 * 96 到 127: 远程核验 (Verification Messages) - 核验相关消息
 */

export const MessageType = {
  // ==================== 系统消息 (System Messages: -128 到 -1) ====================
  // 系统消息特征：由系统自动生成，用户只需查看，不需要操作
  
  /**
   * 系统通知消息 - 通用系统通知
   */
  SYSTEM_NOTIFICATION: -1,
  
  // ==================== 系统通知消息细化 ====================
  
  /**
   * 任务申请通过通知 - 任务申请已通过
   */
  SYSTEM_NOTIFICATION_TASK_APPROVED: -10,
  
  /**
   * 任务申请拒绝通知 - 任务申请被拒绝
   */
  SYSTEM_NOTIFICATION_TASK_REJECTED: -11,
  
  /**
   * 任务完成通知 - 任务已完成
   */
  SYSTEM_NOTIFICATION_TASK_COMPLETED: -12,
  
  /**
   * 任务取消通知 - 任务已取消
   */
  SYSTEM_NOTIFICATION_TASK_CANCELLED: -13,
  
  /**
   * 组织申请通过通知 - 组织申请已通过
   */
  SYSTEM_NOTIFICATION_ORGANIZATION_APPROVED: -14,
  
  /**
   * 组织申请拒绝通知 - 组织申请被拒绝
   */
  SYSTEM_NOTIFICATION_ORGANIZATION_REJECTED: -15,
  
  /**
   * 申请已提交通知 - 用户提交申请后的确认通知
   */
  SYSTEM_NOTIFICATION_APPLICATION_SUBMITTED: -16,
  
  /**
   * 申请已撤回通知 - 用户撤回申请后的确认通知
   */
  SYSTEM_NOTIFICATION_APPLICATION_WITHDRAWN: -17,
  
  /**
   * 取消申请已发送通知 - 用户发送取消申请后的确认通知
   */
  SYSTEM_NOTIFICATION_CANCELLATION_SENT: -18,
  
  /**
   * 任务申请撤回通知 - 任务申请撤回通知
   */
  SYSTEM_NOTIFICATION_TASK_WITHDRAWAL: -19,
  
  /**
   * 任务完成申请撤回通知 - 任务完成申请撤回通知
   */
  SYSTEM_NOTIFICATION_TASK_COMPLETION_WITHDRAWAL: -20,
  
  /**
   * 任务取消申请处理结果通知 - 处理取消申请的结果通知
   */
  SYSTEM_NOTIFICATION_TASK_CANCELLATION_RESULT: -21,
  
  /**
   * 团队邀请已同意消息 - 团队邀请已同意
   */
  SYSTEM_NOTIFICATION_TEAM_INVITATION_ACCEPTED: -24,
  
  /**
   * 团队邀请已拒绝消息 - 团队邀请已拒绝
   */
  SYSTEM_NOTIFICATION_TEAM_INVITATION_REJECTED: -25,
  
  /**
   * 团队邀请已撤回消息 - 团队邀请已撤回
   */
  SYSTEM_NOTIFICATION_TEAM_INVITATION_WITHDRAWN: -26,
  
  /**
   * 团队任务已申请消息 - 团队任务已申请
   */
  SYSTEM_NOTIFICATION_TEAM_TASK_APPLIED: -27,
  
  /**
   * 团队任务已开始消息 - 团队任务已开始
   */
  SYSTEM_NOTIFICATION_TEAM_TASK_STARTED: -28,
  
  /**
   * 团队任务已取消消息 - 团队任务已取消
   */
  SYSTEM_NOTIFICATION_TEAM_TASK_CANCELLED: -29,
  
  /**
   * 团队任务无需处理消息 - 团队任务无需处理
   */
  SYSTEM_NOTIFICATION_TEAM_TASK_NO_NEED: -30,
  SYSTEM_NOTIFICATION_TEAM_VOTE: -31,
  
  // ==================== 用户申请 (User Applications: 0 到 63) ====================
  // 用户申请特征：需要接收方处理（同意/拒绝/验收等），有操作按钮
  
  /**
   * 好友请求消息 - 用户发送的好友请求
   */
  FRIEND_REQUEST: 2,
  
  /**
   * 任务申请消息 - 用户申请任务
   */
  TASK_APPLICATION: 3,
  
  /**
   * 任务完成申请消息 - 用户申请任务完成
   */
  TASK_COMPLETION: 4,
  
  /**
   * 任务取消申请消息 - 用户申请取消任务
   */
  TASK_CANCELLATION: 5,
  
  /**
   * 团队邀请消息 - 邀请用户加入团队
   */
  TEAM_INVITATION: 10,
  
  // ==================== 投票事务 (Vote Affairs: 64 到 95) ====================
  // 投票事务特征：投票相关消息，需要用户进行投票处理
  
  /**
   * 团队投票消息 - 团队踢人/弹劾/选举投票
   */
  TEAM_VOTE: 64,
  
  /**
   * 任务修改投票 - 挑战者对修改申请进行投票
   */
  TASK_MODIFICATION_VOTE: 65,
  
  // ==================== 远程核验 (Verification Messages: 96 到 127) ====================
  // 远程核验消息特征：核验相关消息，有特殊处理逻辑
  
  /**
   * 核验消息 - 反作弊核验通知
   */
  VERIFICATION: 96,
  
  /**
   * 工作核验消息 - 工作状态核验通知
   */
  WORK_VERIFICATION: 97,
  
  /**
   * AI远程提问消息 - AI考试提问通知
   */
  AI_EXAM: 98,
} as const;

/**
 * 消息类型描述映射
 */
export const MessageTypeDescription = {
  // 系统消息 (-128 到 -1)
  [MessageType.SYSTEM_NOTIFICATION]: '系统通知',
  [MessageType.SYSTEM_NOTIFICATION_TASK_APPROVED]: '任务申请通过',
  [MessageType.SYSTEM_NOTIFICATION_TASK_REJECTED]: '任务申请拒绝',
  [MessageType.SYSTEM_NOTIFICATION_TASK_COMPLETED]: '任务完成通知',
  [MessageType.SYSTEM_NOTIFICATION_TASK_CANCELLED]: '任务取消通知',
  [MessageType.SYSTEM_NOTIFICATION_ORGANIZATION_APPROVED]: '组织申请通过',
  [MessageType.SYSTEM_NOTIFICATION_ORGANIZATION_REJECTED]: '组织申请拒绝',
  [MessageType.SYSTEM_NOTIFICATION_APPLICATION_SUBMITTED]: '申请已提交',
  [MessageType.SYSTEM_NOTIFICATION_APPLICATION_WITHDRAWN]: '申请已撤回',
  [MessageType.SYSTEM_NOTIFICATION_CANCELLATION_SENT]: '取消申请已发送',
  [MessageType.SYSTEM_NOTIFICATION_TASK_WITHDRAWAL]: '任务申请撤回',
  [MessageType.SYSTEM_NOTIFICATION_TASK_COMPLETION_WITHDRAWAL]: '任务完成申请撤回',
  [MessageType.SYSTEM_NOTIFICATION_TASK_CANCELLATION_RESULT]: '任务取消申请处理结果',
  [MessageType.SYSTEM_NOTIFICATION_TEAM_INVITATION_ACCEPTED]: '团队邀请已同意',
  [MessageType.SYSTEM_NOTIFICATION_TEAM_INVITATION_REJECTED]: '团队邀请已拒绝',
  [MessageType.SYSTEM_NOTIFICATION_TEAM_INVITATION_WITHDRAWN]: '团队邀请已撤回',
  [MessageType.SYSTEM_NOTIFICATION_TEAM_TASK_APPLIED]: '团队任务已申请',
  [MessageType.SYSTEM_NOTIFICATION_TEAM_TASK_STARTED]: '团队任务已开始',
  [MessageType.SYSTEM_NOTIFICATION_TEAM_TASK_CANCELLED]: '团队任务已取消',
  [MessageType.SYSTEM_NOTIFICATION_TEAM_TASK_NO_NEED]: '团队任务无需处理',
  [MessageType.SYSTEM_NOTIFICATION_TEAM_VOTE]: '团队投票通知',
  
  // 用户事务 (0 到 63)
  [MessageType.FRIEND_REQUEST]: '好友请求',
  [MessageType.TASK_APPLICATION]: '任务申请',
  [MessageType.TASK_COMPLETION]: '任务完成申请',
  [MessageType.TASK_CANCELLATION]: '任务取消申请',
  [MessageType.TEAM_INVITATION]: '团队邀请',
  
  // 投票事务 (64 到 95)
  [MessageType.TEAM_VOTE]: '团队投票',
  [MessageType.TASK_MODIFICATION_VOTE]: '任务修改投票',
  
  // 远程核验消息 (96 到 127)
  [MessageType.VERIFICATION]: '核验消息',
  [MessageType.WORK_VERIFICATION]: '工作核验',
  [MessageType.AI_EXAM]: 'AI远程提问',
} as const;

/**
 * 消息状态常量 - 根据后端标准定义
 */

// 用户申请状态 (UserApplication)
export const UserApplicationStatus = {
  PENDING: 0,    // 未处理
  APPROVED: 1,   // 已同意
  REJECTED: 2,   // 已拒绝
  WITHDRAWN: 3,  // 已撤回
  INVALID: 4,    // 已失效
} as const;

// 投票消息状态 (VoteMessage)
export const VoteMessageStatus = {
  PENDING: 0,          // 待投票
  VOTED_APPROVE: 1,    // 已投同意
  VOTED_REJECT: 2,     // 已投拒绝
  WITHDRAWN: 4,        // 已撤回
  ENDED: 5,            // 已结束（投票提前结束或时间到期）
} as const;

// 核验消息状态 (VerificationMessage)
export const VerificationMessageStatus = {
  PENDING: 0,    // 未处理
  PROCESSED: 1,  // 已处理
  EXPIRED: 2,    // 已过期
} as const;

// 系统通知状态 (SystemNotification)
export const SystemNotificationStatus = {
  UNREAD: 0,     // 未读
  READ: 1,       // 已读
} as const;

/**
 * 消息状态描述映射 - 使用 getStatusDescriptionByType 替代
 */
export const MessageStatusDescription = {
  // 基础状态映射，具体描述由 getStatusDescriptionByType 处理
  0: '待处理',
  1: '已处理', 
  2: '已拒绝',
  3: '已撤回',
} as const;

// 根据消息类型获取状态描述
export const getStatusDescriptionByType = (status: number, messageType: number): string => {
  // 系统通知类型 (-128 到 -1)
  if (messageType >= -128 && messageType <= -1) {
    const statusMap: Record<number, string> = {
      [SystemNotificationStatus.UNREAD]: '未读',
      [SystemNotificationStatus.READ]: '已读',
    };
    return statusMap[status] || '未知状态';
  }
  // 用户事务类型 (0 到 63)
  else if (messageType >= 0 && messageType <= 63) {
    const statusMap: Record<number, string> = {
      [UserApplicationStatus.PENDING]: '待处理',
      [UserApplicationStatus.APPROVED]: '已同意',
      [UserApplicationStatus.REJECTED]: '已拒绝',
      [UserApplicationStatus.WITHDRAWN]: '已撤回',
      [UserApplicationStatus.INVALID]: '已失效',
    };
    return statusMap[status] || '未知状态';
  }
  // 投票事务类型 (64 到 95)
  else if (messageType >= 64 && messageType <= 95) {
    const statusMap: Record<number, string> = {
      [VoteMessageStatus.PENDING]: '待投票',
      [VoteMessageStatus.VOTED_APPROVE]: '已投同意',
      [VoteMessageStatus.VOTED_REJECT]: '已投拒绝',
      [VoteMessageStatus.WITHDRAWN]: '已撤回',
      [VoteMessageStatus.ENDED]: '已结束',
    };
    return statusMap[status] || '未知状态';
  }
  // 远程核验消息类型 (96 到 127)
  else if (messageType >= 96 && messageType <= 127) {
    const statusMap: Record<number, string> = {
      [VerificationMessageStatus.PENDING]: '未处理',
      [VerificationMessageStatus.PROCESSED]: '已处理',
      [VerificationMessageStatus.EXPIRED]: '已过期',
    };
    return statusMap[status] || '未知状态';
  }
  
  return '未知状态';
};

/**
 * 工具函数
 */
export const MessageUtils = {
  /**
   * 判断是否为系统消息
   * 系统消息特征：用户只需查看，不需要操作
   * 编码范围：-128 到 -1
   */
  isSystemMessage: (type: number): boolean => {
    return type >= -128 && type <= -1;
  },
  
  /**
   * 判断是否为用户事务
   * 用户事务特征：需要接收方处理（同意/拒绝/验收等），有操作按钮
   * 编码范围：0 到 63
   */
  isUserMessage: (type: number): boolean => {
    return type >= 0 && type <= 63;
  },
  
  /**
   * 判断是否为投票事务
   * 投票事务特征：投票相关消息，需要用户进行投票处理
   * 编码范围：64 到 95
   */
  isVoteMessage: (type: number): boolean => {
    return type >= 64 && type <= 95;
  },
  
  /**
   * 判断是否为远程核验消息
   * 远程核验消息特征：核验相关消息，有特殊处理逻辑
   * 编码范围：96 到 127
   */
  isVerificationMessage: (type: number): boolean => {
    return type >= 96 && type <= 127;
  },

  /**
   * 获取消息类型描述
   */
  getTypeDescription: (type: number): string => {
    return MessageTypeDescription[type as keyof typeof MessageTypeDescription] || '未知类型';
  },

  /**
   * 获取消息状态描述
   */
  getStatusDescription: (status: number): string => {
    return MessageStatusDescription[status as keyof typeof MessageStatusDescription] || '未知状态';
  },

  /**
   * 格式化时间
   */
  formatTime: (timeStr: string): string => {
    if (!timeStr) return '-';
    return timeStr.replace('T', ' ').slice(0, 19);
  }
};

// 导出类型定义
export type MessageTypeValue = typeof MessageType[keyof typeof MessageType];

